package cn.zxinrun.core.model.response;

import cn.zxinrun.core.constant.CommonConstants;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

/**
 * 通用请求返回主体
 * @author Mr.Zhang
 * @since 1.0
 **/
@Data
@Builder
public class ApiResponse<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    // 状态码
    private int code;
    // 消息提示
    private String message;
    // 业务数据
    private T data;
    // 时间戳
    private long timestamp;// 时间戳

    /**
     * 成功
     * @param <T> 指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> success() {
        return restResult(null, CommonConstants.SUCCESS, CommonConstants.SUCCESS_TEXT);
    }

    /**
     * 成功
     * @param data 返回数据
     * @param <T>  指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> success(T data) {
        return restResult(data, CommonConstants.SUCCESS, CommonConstants.SUCCESS_TEXT);
    }

    /**
     * 成功
     * @param data    返回数据
     * @param message 提示信息
     * @param <T>     指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> success(T data, String message) {
        return restResult(data, CommonConstants.SUCCESS, message);
    }

    /**
     * 失败
     * @param <T> 指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> failed() {
        return restResult(null, CommonConstants.FAIL, CommonConstants.FAIL_TEXT);
    }

    /**
     * 失败
     * @param message 提示信息
     * @param <T>     指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> failed(String message) {
        return restResult(null, CommonConstants.FAIL, message);
    }

    /**
     * 失败
     * @param data 返回数据
     * @param <T>  指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> failed(T data) {
        return restResult(data, CommonConstants.FAIL, CommonConstants.FAIL_TEXT);
    }

    /**
     * 失败
     * @param data    返回数据
     * @param message 提示信息
     * @param <T>     指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> failed(T data, String message) {
        return restResult(data, CommonConstants.FAIL, message);
    }

    /**
     * 自定义返回
     * @param data    返回数据
     * @param code    状态码
     * @param message 提示信息
     * @param <T>     指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> result(T data, int code, String message) {
        return restResult(data, code, message);
    }

    /**
     * 自定义返回
     * @param data    返回数据
     * @param code    状态码
     * @param message 提示信息
     * @param <T>     指定的类型
     * @return Result
     */
    public static <T> ApiResponse<T> restResult(T data, int code, String message) {
        return ApiResponse.<T>builder()
                .code(code)
                .data(data)
                .message(message)
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 请求是否成功
     * @return true:成功 false:失败
     */
    public Boolean isSuccess() {
        return (this.code == CommonConstants.SUCCESS);
    }

}
